在pve中向zfs中导入openwrt-img

pve zfs

  1. 先将编译好的raw img(不要选EFI的,实测UEFI无法启动。原始img+pve seabios成功启动)上传到local(pve)下的ISO image中,成功后在task找到路径:

    pve-zfs-import-openwrt-img

  2. 但直接导入zfs会提示:zfs error: cannot create ‘rpool/data/vm-101-disk-0’: volume size must be a multiple of volume block size

    这是因为zfs要求img是4K的整数倍。因此需要向末尾写入0凑齐64K整数倍:

    1
    2
    
    ls -al /var/lib/vz/template/iso/openwrt-x86-64-generic-squashfs-combined.img
    -rw-r--r-- 1 root root 185106452 Nov 30 12:40 /var/lib/vz/template/iso/openwrt-x86-64-generic-squashfs-combined.img
    
  3. 计算补齐字节数 假定img大小为185106452,先计算它除64K的整数

    185106452/(64*1024)=2,824.5078125

    然后用凑整的数计算比它大的最小的4K整数倍大小

    2825*(64*1024)=185,139,200

    最后用64K的整数倍送去原来大小,计算出要写入多少0:

    185,139,200-185106452=32,748

    可以用python:

1
2
    import math
    def pad_size(ori_size, block_size=64): return math.ceil(ori_size*1.0/block_size/1024)*block_size*1024-ori_size
  1. 写入空白补齐

    dd if=/dev/zero bs=1 count=32748 >> ./openwrt-x86-64-generic-squashfs-combined.img

  2. 导入zfs(假设101为虚拟机id)

    /sbin/qm importdisk 101 /var/lib/vz/template/iso/openwrt-x86-64-generic-squashfs-combined-efi.img local-zfs

    (raw img最好先转换为qcow2,qcow2格式是QEMU支持的一种主流磁盘映像格式,与raw格式相比,qcow2具有存储空间占用小、支持写时拷贝(COW, copy-on-write)、支持zlib压缩及支持AES加密等特性。)

    qemu-img convert -f raw -O qcow2 ./openwrt-x86-64-generic-squashfs-combined.img vm-101-disk-0.qcow2

    /sbin/qm importdisk 101 /mnt/pve/dsm/images/immortalwrt-x86-64-generic-squashfs-combined-efi-20240902.qcow2 local-zfs

  3. 使用磁盘 到Hardware中双击新硬盘vm-101-disk-0,点击Add